/*—————————————————————————————————————————————————————————— axios封装ts接口 ——————————————————————————————————————————————————————————*/

/* eslint-disable @typescript-eslint/no-explicit-any */
import { AxiosInstance, AxiosResponse, InternalAxiosRequestConfig } from 'axios'

// axios的Config类型声明
type axiosConfig = InternalAxiosRequestConfig<any>

type axiosType = Promise<AxiosResponse<any, any>>

// axios封装主函数
// -----------------------------------------------------------------------------------------------------------
// axios定制化合集字典成员
type CustomOptionsMapItem =
  | 'requestCancel' // 是否开启取消重复请求
  | 'dataFormat' // 是否开启简洁的数据结构响应
  | 'errorMessageShow' // 是否开启接口错误信息展示
  | 'codeMessageShow' // 是否开启code不为0时的信息提示
  | 'isTokenHeader' // 是否需要请求头携带token

// axios定制化合集字典
export type CustomOptionsMap = {
  [key in CustomOptionsMapItem]?: boolean
}

// axios封装函数接口
export interface MyAxiosType {
  ( customOptions?: CustomOptionsMap): AxiosInstance
}

// 生成唯一的每个请求的唯一key函数接口
// -----------------------------------------------------------------------------------------------------------
export interface GetPendingKeyType {
  (config: axiosConfig): string
}

// 储存每个请求的唯一cancel回调函数接口
// -----------------------------------------------------------------------------------------------------------
export interface AddPendingType {
  (config: axiosConfig): void
}

// 删除重复的请求函数接口
// -----------------------------------------------------------------------------------------------------------
export interface RemovePendingType {
  (config: axiosConfig): void
}

// 处理异常
// -----------------------------------------------------------------------------------------------------------
export interface HttpErrorStatusHandleType {
  (error: any): string
}

// 请求函数接口
// -----------------------------------------------------------------------------------------------------------
// 请求类型声明
type RequestItems = 'get' | 'post' | 'put' | 'delete' | 'download'

// request返回成员的类型
interface RequestReturnItemType {
  (
    path: string,
    params?: object,
    config?: Omit<axiosConfig, 'method' | 'url' | 'params' | 'data'>,
  ): axiosType
}

// request返回类型
type RequestReturn = {
[key in RequestItems]:RequestReturnItemType
}

// 请求函数接口
export interface Request {
  (
    customOptions?: CustomOptionsMap
  ): RequestReturn
}
